#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
class Solution {
private :
    struct unit {
        int index;
        int value;
        unit(int index_,int value_):index(index_),value(value_){}
    };
public:
    vector<int> advantageCount(vector<int>& A, vector<int>& B) {
        sort(A.begin(), A.end());
        vector<unit>B_;
        for (int i = 0; i < B.size(); ++i) {
            B_.emplace_back(i, B[i]);
        }
        sort(B_.begin(), B_.end(), [](const unit& left, const unit& right) {
            return left.value < right.value; });
        
        vector<int>res = A;
        int left = 0;
        int end=B_.size();
        for (int i = 0; i < end; ++i) {
            int index = 0;
            if (B_[i].value < A[left]) {
                index = B_[i].index;
            }
            else {
                index = B_[--end].index;
                --i;
            }
            res[index] = A[left++];
        }
        return res;
    }
};
//class Solution {
//public:
//    vector<int> advantageCount(vector<int>& A, vector<int>& B) {
//        vector<int> A_copy = A;
//        vector<int> B_copy = B;
//
//        sort(A_copy.begin(), A_copy.end());
//        sort(B_copy.begin(), B_copy.end());
//
//        unordered_map<int, vector<int>> B_map;
//        vector<int> remaining;
//        for (auto i : B_copy) {
//            B_map[i] = vector<int>();
//        }
//        int index = 0;
//        for (auto i : A_copy) {
//            if (i > B_copy[index]) {
//                B_map[B_copy[index++]].push_back(i);
//            }
//            else {
//                remaining.push_back(i);
//            }
//        }
//        vector<int> res=A;
//        for (int i = 0; i < B.size(); i++) {
//            if (B_map[B[i]].size() > 0) {
//                int tmp=B_map[B[i]].back();
//                B_map[B[i]].pop_back();
//                res[i] = tmp;
//            }
//            else {
//                int tmp = remaining.back();
//                remaining.pop_back();
//                res[i] = tmp;
//            }
//        }
//        return res;
//    }
//};